package org.seckill.service;

import org.seckill.Exception.RepeatKillException;
import org.seckill.Exception.SeckillCloseException;
import org.seckill.Exception.SeckillException;
import org.seckill.dto.Exposer;
import org.seckill.dto.SeckillExecution;
import org.seckill.entity.Seckill;

import java.util.List;

/**
 * 业务接口：站在使用者的角度设计接口
 * 三个方面：方法定义力度、参数、返回类型（return 类型/异常）
 * Created by Elmer on 2017/7/30.
 */
public interface ISeckillService {
    /**
     * 查询所有秒杀记录
     * @return
     */
    List<Seckill> getSeckillList();

    /**
     * 查询单个秒杀接口
     * @param seckillId
     * @return
     */
    Seckill getById(Long seckillId);

    /**
     * 秒杀开始时输出秒杀地址，否则输出系统时间和秒杀时间
     *
     * @param seckillId
     */
    Exposer exportSeckillURL(Long seckillId);

    /**
     * 声明式事务
     * 执行秒杀操作
     * @param seckillId
     * @param userPhone
     * @param md5
     */
    SeckillExecution executeSeckill(Long seckillId, Long userPhone, String md5) throws SeckillException,RepeatKillException,SeckillCloseException;

    /**
     * 存储过程
     * 执行秒杀操作
     * @param seckillId
     * @param userPhone
     * @param md5
     */
    SeckillExecution executeSeckillProcedure(Long seckillId, Long userPhone, String md5) throws SeckillException;

}
